package com.y3k.dashboard.view
{
	import com.y3k.model.CustomFilter;
	import com.y3k.model.Session;
	
	import flash.events.MouseEvent;
	
	import mx.containers.VBox;
	import mx.controls.Alert;
	import mx.events.FlexEvent;
	import mx.events.IndexChangedEvent;
	import mx.rpc.AsyncToken;
	import mx.rpc.events.FaultEvent;
	import mx.rpc.events.ResultEvent;
	import mx.rpc.remoting.RemoteObject;

	public class PodContentBase extends VBox
	{
		[Bindable]
		public var properties:XML;

		public var drillLevel:Number=0;

		public var viewRefreshTime:String;

		public var loaded:Boolean=false;

		function PodContentBase()
		{
			super();
			percentWidth=100;
			percentHeight=100;
			addEventListener(FlexEvent.CREATION_COMPLETE, onCreationComplete);
		}

		// Funciones para habilitar y deshabilitar los componentes que necesitan refrescar su información.
		// Se cambia el aspecto para indicar que la información se está refrescando
		public function disable():void
		{
			this.enabled=false;
			this.mouseEnabled=false;
			this.alpha=0.5;
		}

		public function enable():void
		{
			/* TODO falta tener un contador por cada tab de nivel 2 que se incremente en el disable y en el enable se decremente
			 * si luego de decrementar vale cero, entonces ejecutar el codigo de abajo. Sino dejarlo disabled porque
			 * el pod aun se esta actualizando con una consulta (filtro) que se lanzo despues que el que se esta resolviendo ahora.
			 */
			this.enabled=true;
			this.mouseEnabled=true;
			this.alpha=1;
		}

		private function onCreationComplete(e:FlexEvent):void
		{
			refresh();
		}

		// El accordion overridea este metodo porque necesita otra logica
		public function refresh(filterName:String=null):void
		{
			var query:String=properties.@query;

			var customFilter:CustomFilter=new CustomFilter();
			customFilter.refreshTime=viewRefreshTime;

			/* Solo ejecutar la query si:
			 * 1- la misma contiene al filtro que cambio y que origino este refresh y el pod tiene refresh true.
			 * 2- el refresh se origino por refreshTime (evento onTick), en tal caso fitlerName es null y el pod tiene refresh "comeFromReload".
			 * 3- el refresh se origino por un click en el boton reload de la barra de titulo del pod, en tal caso fitlerName es .
			 * 4- aun no esta cargada la informacion (!loaded)
			 */
			if (filterName == "comeFromReload" || (filterName == null && isRefresh()) || !loaded || (isRefresh() && query.search(filterName) != -1))
			{
				var remote:RemoteObject=new RemoteObject("queryService");
				var token:AsyncToken=remote.execute(query, Session.filters, customFilter);
				token.addResponder(new mx.rpc.Responder(onResultService, onFaultService));
				loaded=true;
				disable();
			}
		}

		public function onFaultService(e:FaultEvent):void
		{
			Alert.show("Unable to execute query : " + e.message.toString());
		}

		public function isRefresh():Boolean
		{
			return new Boolean(properties.@refresh == "true");
		}

		protected function onResultService(e:ResultEvent):void
		{
			enable();
		}

		protected function dispatchViewStackChange(newIndex:Number):void
		{
			dispatchEvent(new IndexChangedEvent(IndexChangedEvent.CHANGE, true, false, null, -1, newIndex));
		}

		public function getDrillQuery():String
		{
			var xmlData:XMLList=properties.drill.drillData;
			var len:Number=xmlData.length();

			for (var i:Number=0; i < len; i++)
			{
				if (xmlData[i].@level == drillLevel + 1)
				{
					drillLevel++;
					return xmlData[i].@query;
				}
			}
			drillLevel=0;
			return properties.@query;
		}

		public function exportar(e:MouseEvent):void
		{
			// Nada
		}
	}
}